package py.com.erpone.session.dm;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.annotation.PostConstruct;
import javax.ejb.LocalBean;
import javax.ejb.Remote;
import javax.ejb.Stateful;
import javax.enterprise.context.Conversation;
import javax.enterprise.context.ConversationScoped;
import javax.inject.Inject;
import javax.inject.Named;
import javax.management.relation.RoleList;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceContextType;

import org.primefaces.model.DualListModel;



import py.com.erpone.entity.dm.Presentacion;
import py.com.erpone.entity.dm.Rol;
import py.com.erpone.entity.dm.Tarea;
import py.com.erpone.session.dm.list.PresentacionList;
import py.com.erpone.session.dm.list.RolList;
import py.com.erpone.session.dm.list.TareaList;

@Stateful
@Named // para tener acceso al objeto
@LocalBean // Designates that a session bean exposes a no-interface view. 
@ConversationScoped // para que mantenga la conversacion cuando se inicia. (solamente en stateful)
public class RolBean {
	@PersistenceContext(type=PersistenceContextType.EXTENDED) // detecta el nombre del config del persistence. 												  // (en este caso sin parametro por que hay solo un persistence unit)
	private EntityManager em;
	
	@Inject // para que instancie una clase , para usar sus elementos.
	private Conversation conversation;
	
	@Inject
	private RolList rolList;
	
	private Rol rol;
	//private String rol_db;
	
	@Inject
	private TareaList tareaList;
	
	@Inject
	private UsuarioBean usuarioBean;
	
	private DualListModel<Tarea> dualListTareas;
	
	
	public RolBean() {
    }
	@PostConstruct
	public void postConstruct() {
		if(conversation.isTransient()) 
			conversation.begin(); 
		rol=new Rol();
		List<Tarea> source = tareaList.findAll();//Agrego las tareas al source.
		List<Tarea> target = new ArrayList<Tarea>();  
		this.dualListTareas = new DualListModel<Tarea>(source, target);		
	}
	public Rol getRol() {
		return rol;
	}

	public void setRol(Rol rol) {
		this.rol = rol;
	}
	
	

	public DualListModel<Tarea> getTareas() {
		return dualListTareas;
	}

	public void setTareas(DualListModel<Tarea> tareas) {
		this.dualListTareas = tareas;
	}

	// Para iniciar la conversacion 
	public void iniciar(){
		
		
		
		//return "/dm/rol.xhtml"; // Retorna la pagina del formulario. (Registrar sector)
	}
	
	// Para editar el Sector
	public String iniciar(Rol rol){
		if(conversation.isTransient())
			conversation.begin();
		this.rol=rol;
		List<Tarea> source = tareaList.findAll();	
		rol.setTarea(rolList.findAllTareas(rol.getId()));
				
        List<Tarea> target = rol.getTarea();
        List<Tarea> lista =  (List<Tarea>)((ArrayList<Tarea>)source).clone();        
        for (Tarea origen : source) {
        	for (Tarea destino : target) {
				if(origen.equals(destino)){
					lista.remove(lista.indexOf(origen));
					break;
				}	
			}		
		}        
        this.setTareas(new DualListModel<Tarea>(lista, target));	
		
		
		
		
		return "/dm/rol.xhtml";
	}//Fin del metodo iniciar.
	
	//Método que convierte en mayúscula la primera letra de cada palabra, se invoca al momento de guardar.
	   public String upperscaseEveryFirstLetter(String str){   
		      StringBuffer stringbf = new StringBuffer();
		      Matcher m = Pattern.compile("([a-z])([a-z]*)",
		      Pattern.CASE_INSENSITIVE).matcher(str);
		      while (m.find()) {
		         m.appendReplacement(stringbf, 
		         m.group(1).toUpperCase() + m.group(2).toLowerCase());
		      }
		      return stringbf.toString();
	   }
	
	public void guardar(){
		try {
			rol.setTarea((List<Tarea>)dualListTareas.getTarget());
			if(rol.getId()==null){ // Verifica si existe Id antes de guardar.
				//System.out.println("Se guarda un nuevo registro en la base de datos.");
				em.persist(rol); // Almacena en la base de datos
			}else{
				rol.setDescripcion(upperscaseEveryFirstLetter(rol.getDescripcion()));
				em.merge(rol); // Actualiza en la base de datos
				//System.out.println("Se actualiza un registro en la base de datos.");
			}
			if(!conversation.isTransient()) // Si se inicio la conversacion
				conversation.end(); // Termina la conversacion
		} catch (Exception e) {
			e.printStackTrace();
		}	
        usuarioBean.getDualListRol().setSource(rolList.findAll());		
		this.iniciar();
//		List<Tarea> source = tareaList.findAll();//Agrego las tareas al source.
//		List<Tarea> target = new ArrayList<Tarea>(); 
//		this.dualListTareas = new DualListModel<Tarea>(source, target);
		//return "/dm/roles.xhtml";
	}
	 
	   
	
	public void eliminar(Rol rol){
		em.remove(em.merge(rol));
		if(!conversation.isTransient())
			conversation.end();
		//return "/dm/roles.xhtml";
	}

	public String cancelar(){
		if(!conversation.isTransient())
			conversation.end();
		return "/dm/roles.xhtml";
	}
	
    

}//Fin de la clase TareaBean.
